#第一题
# 读取表达矩阵
expr_matrix <- read.csv("matrix.csv", row.names = 1) 

# Log2 转换（+1 防止 log(0)）
log_expr <- log2(as.matrix(expr_matrix) + 1)  # 保证是矩阵格式

# 随机抽样 20000 个值
set.seed(42)
sample_values <- sample(as.vector(log_expr), 20000)

# 使用 base R 画直方图
jpeg("histogram_sampled.jpg", width = 800, height = 600)
hist(sample_values,
     breaks = 100,
     main = "Sampled Expression Distribution (log2)",
     xlab = "Log2(Expression + 1)",
     col = "skyblue", border = "white")

dev.off()

#第二题
numeric_data <- merged_data[, sapply(merged_data, is.numeric)]
log_expr <- log2(numeric_data + 1)  # 转换数据，+1 防止出现 log(0)

#计算样本之间的距离
dist_mat <- dist(log_expr)   # 使用样本之间的欧式距离

#层次聚类（根据样本聚类）
hc <- hclust(dist_mat, method = "complete") 

# 使用 pdf() 保存图像
jpeg("hierarchical_clustering_samples.jpg", width = 1400, height = 800)

# 绘制树状图
plot(hc, 
     main = "Hierarchical Clustering of Samples",
     xlab = "", sub = "",
     cex = 0.8, hang = -1)

dev.off()

#第三题
library(ggplot2)
library(dplyr)
library(ggrepel)

valcano <- prostat

# 设置颜色分类：根据P值和FC值判断上调（红）、下调（绿）或无显著差异（灰）
valcano <- valcano %>%
  mutate(
    color = case_when(
      P < 0.05 & FC > log2(1.2) ~ "red",   # 显著上调
      P < 0.05 & FC < log2(1/1.2) ~ "green", # 显著下调
      TRUE ~ "grey"  # 不显著变化
    )
  )

# 给显著基因添加标签（仅标注上调或下调基因）
valcano$label[valcano$P < 0.05 & valcano$FC > log2(1.2)] <- valcano$ID[valcano$P < 0.05 & valcano$FC > log2(1.2)]
valcano$label[valcano$P < 0.05 & valcano$FC < log2(1/1.2)] <- valcano$ID[valcano$P < 0.05 & valcano$FC < log2(1/1.2)]

# 从有标签的基因中，挑选出P值最小的前10个，作为重点标注
top_labels <- valcano %>%
  filter(!is.na(label)) %>%
  arrange(P) %>%
  slice(1:10)

# 开始绘图
ggplot(valcano, aes(x = FC, y = -log10(P))) +
  geom_point(aes(color = color)) +  # 绘制散点，颜色根据差异显著性区分
  geom_text_repel(data = top_labels, aes(label = label), color = "black") +  # 添加标签，避免重叠
  geom_hline(yintercept = -log10(0.05), linetype = 4) +  # 添加p值 = 0.05 的参考线
  geom_vline(xintercept = c(-log2(1.2), log2(1.2)), linetype = 4)  # 添加log2 FC阈值参考线（上调/下调）


#保存图像为jpg
ggsave("valcano_plot.jpg", dpi=600, width=15, height=12)